package com.lzxuni.common.exception;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.lzxuni.utils.BaseDao;
import com.lzxuni.utils.JsonResult;
import com.lzxuni.utils.JsonResultUtil;
import com.lzxuni.utils.MethodUtil;

/**
 * 
 * <b>功能：</b>springmvc 统一异常处理，包括ajax <br>
 * <b>作者：</b>孙志强<br>
 * <b>日期：</b> 2016年12月31日 下午10:25:05 <br>
 *
 * @version 1.0
 */
public class CustomExceptionResolver implements HandlerExceptionResolver {
	private static Log logger = LogFactory.getLog(BaseDao.class);
	// 前端控制器DispatcherServlet在进行HandlerMapping、调用HandlerAdapter执行Handler过程中，如果遇到异常就会执行此方法
	// handler最终要执行的Handler，它的真实身份是HandlerMethod
	// Exception ex就是接收到异常信息
	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		// 统一异常处理代码
		// 针对系统自定义的CustomException异常，就可以直接从异常类中获取异常信息，将异常处理在错误页面展示
		// 异常信息
		ex.printStackTrace(); 
		logger.error("controller异常"+ex.getMessage());
		String message = null;
		CustomException customException = null;
		// 如果ex是AuthorizationException异常，跳转到没权限页面，如果不是，跳转到错误页面
		if (ex instanceof AuthorizationException) {
			customException = new CustomException("无权访问");
		} else {
			customException = new CustomException("未知错误");
		}
		JSONObject jsonObject = new JSONObject();
		// 错误信息
		message = customException.getMessage();
		request.setAttribute("message", message);
		try {
			if (request.getHeader("x-requested-with") != null
					&& request.getHeader("x-requested-with").equalsIgnoreCase(
							"XMLHttpRequest")) {
				jsonObject.put("status", "500");
				JsonResult jsonResultError = JsonResultUtil
						.getErrorJson(message);
				MethodUtil.writer(response, JSON.toJSONString(jsonResultError));
			} else {
				request.getRequestDispatcher("/WEB-INF/views/refuse.jsp")
						.forward(request, response);
				return null;
			}
			// 转向到错误 页面
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView();
	}

}
